<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // 共有的属性和方法重复声明  占用内存  
        // 解决方案  
        // 把共有的方法和属性 取出来 存放到 一个统一的位置 (prototype 原型对象)   允许所有的数据 


        // 构造函数 (构造器 + 原型对象 + 静态对象 )
        function Cat(name,color){

            // 构造器 
            this.name = name;
            this.color = color;
        }
        // 共有的
        // this.type = "cat"
        // this.call = function(){
        //     console.log("喵喵 ~~ ")
        // }
        // this.skill = function(){
        //     console.log("抓老鼠~")   // 违背了 面向对象的本意 => 抽象 => 不建议写具体 
        // }
        // this.say = function(){
        //     console.log(this.name , this.color);
        // }

        // 静态对象  static    与this 无关
        Cat.hobby = ["睡觉","吃饭"];

        // 原型对象  prototype 存放实例化对象的共有对象和属性  (允许所有的实例化对象访问)   与this 有关
        Cat.prototype.type = "cat";
        Cat.prototype.call = function(){
            console.log("喵喵 ~~ ")   
        }
        Cat.prototype.skill = function(){
            console.log("抓老鼠~")   
        }
        Cat.prototype.say = function(){    // 原型对象的this 指向实例化对象本身 
            console.log(this.name , this.color);
        }

        // Car.__proto__.a = "a"  error 
 
        console.log(Cat.prototype);    // {constructor }   原型对象   constructor  指向当前原型对应的原型
        var cat1 = new Cat("Lucy","white");   // this =>  cat1   Cat.prototype = cat1 
        console.log(cat1,cat1 instanceof Cat);    // __proto__ 当前对象的  原型对象  缩写的key   prototype

        console.log(cat1.name)
        console.log(cat1.color)
        console.log(cat1.type)
        cat1.call()
        cat1.say()

        console.log(cat1.hobby)
        console.log(Cat.hobby)

        console.log("==================")

        var cat2 = new Cat("Tom","ornage");

        // 自己有      ==>   自己的实例本身 构造器 
        console.log(cat2.name)
        console.log(cat2.color)
     
        //  自己没有      ==>  自己的原型对象  (prototype 寻找 )
        console.log(cat1.type)  
        // 自己的 prototype 也没有  ==> undefined
        console.log(cat2.weight)

        // 继承 

        // this 永远指向当前的实例化对象 

    </script>
</body>
</html>